package org.example.task.model.vo;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.example.task.constant.response.HttpStatus;
import org.example.task.constant.response.StatusMessage;

import java.io.Serializable;

@Data
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class R<T> implements Serializable {
    // 状态码
    private Integer code;

    // 消息提示
    private String msg;

    // 返回数据
    private T data;

    // 时间戳（可选）
//    private Long timestamp = System.currentTimeMillis();

    // 成功静态方法
    public static <T> R<T> success() {
        return success(null);
    }

    public static <T> R<T> success(T data) {
        R<T> r = new R<>();
        r.setCode(HttpStatus.SUCCESS);
        r.setMsg(StatusMessage.getMessage(HttpStatus.SUCCESS)); // 自动获取默认消息
        r.setData(data);
        return r;
    }

    public static <T> R<T> success(T data, String message) {
        R<T> r = new R<>();
        r.setCode(200);
        r.setMsg(message);
        r.setData(data);
        return r;
    }

    // 错误静态方法
    public static <T> R<T> error(String message) {
        return error(500, message);
    }

    public static <T> R<T> error(Integer code, String message) {
        R<T> r = new R<>();
        r.setCode(code);
        r.setMsg(message != null ? message : StatusMessage.getMessage(code));
        return r;
    }

    public static <T> R<T> error(Integer code, String message, T data) {
        R<T> r = new R<>();
        r.setCode(code);
        r.setMsg(message);
        r.setData(data);
        return r;
    }

    // 链式调用方法（可选）
    public R<T> code(Integer code) {
        this.code = code;
        return this;
    }

    public R<T> msg(String msg) {
        this.msg = msg;
        return this;
    }

    public R<T> data(T data) {
        this.data = data;
        return this;
    }
}
